保护 JavaScript 源代码


可以通过将应用程序的 JavaScript 源代码编译为原生代码并由 NW.js 加载来保护 JavaScript 源代码。您只需在生产环境中将编译后的代码与您的应用程序一起分发。

编译

JS 源代码使用工具 nwjc 编译为原生代码,该工具在 SDK 构建中提供。

要使用它

nwjc source.js binary.bin

*.bin 文件需要与您的应用程序一起分发。您可以随意命名它。

如果您正在编译模块,则需要 --nw-module 参数。

加载已编译的 JavaScript

nw.Window.get().evalNWBin(frame, 'binary.bin');

win.evalNWBin() 方法的参数与 Window.eval() 方法类似,其中第一个参数是目标 iframe(对于主框架为 null),第二个参数是二进制代码文件。

如果您正在为模块加载二进制文件,则应使用 win.evalNWBinModule()

从远程加载已编译的 JavaScript

编译后的 JavaScript 可以从远程获取(例如使用 AJAX)并在运行时执行。

var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer'; // make response as ArrayBuffer
xhr.open('GET', url, true);
xhr.send();
xhr.onload = () => {
  // xhr.response contains compiled JavaScript as ArrayBuffer
  nw.Window.get().evalNWBin(null, xhr.response);
}

注意

编译后的代码在 浏览器上下文 中执行。您可以使用任何 Web API(例如 DOM)以及 访问 NW.js API 和 Node API,就像在浏览器上下文运行的其他脚本一样。

在 Web Workers 中使用

在 worker 上下文中引入了一个名为 `importNWBin(ArrayBuffer)` 的函数。二进制文件可以在主线程中读取到数组缓冲区,然后发布到 worker,并使用新函数在那里执行。

已知问题

在 0.22 版本之前,编译后的代码运行速度 **比普通 JS 慢**:根据 v8bench,性能下降约 30%。其他未编译的 JS 源代码不受影响。在 0.22.0-beta1 中,此问题已修复。请查看我们的博客文章:https://nw.js.cn/blog/js-src-protect-perf/

编译后的代码 **不跨平台,也不兼容不同版本的 NW.js**。因此,在打包应用程序时,需要为每个平台运行 `nwjc`。